import { Injectable } from '@angular/core';

/**
 * 表格选择的支持服务，配合NZ-TABLE的选择使用。
 * 使用方法：
 * 1：初始化表格数据时，同时初始化idList,将表格数据的id保存到idList中。
 * 2：表头选择框 [nzChecked] 绑定 thChecked ； [nzIndeterminate] 绑定 thIndeterminate
 * 3：表头 (nzCheckedChange) 绑定 onAllChecked
 * 4：表格内容 (nzCheckedChange) 绑定 onItemChecked
 * 5：表格内容 [nzChecked] 绑定 setOfCheckedId.has(data.id)
 * 6: setOfCheckedId是所有已选数据ID的SET
 *
 *
 */

@Injectable()
export class TableCheckService {

  thChecked = false;
  thIndeterminate = false;
  setOfCheckedId = new Set<number>();
  idList:Array<number> = new Array();

  constructor() { }

  onAllChecked(e: boolean) {
    this.idList.forEach(id => this.updateCheckedSet(id, e));
    this.refreshCheckedStatus();
  }

  oneItemChecked(id: number, e: boolean) {
    this.updateCheckedSet(id, e);
    this.refreshCheckedStatus()
  }

  private refreshCheckedStatus() {
    this.thChecked = this.idList.every(id => this.setOfCheckedId.has(id));
    this.thIndeterminate = this.idList.some(id => this.setOfCheckedId.has(id)) && !this.thChecked;
  }

  private updateCheckedSet(id: number, checked: boolean) {
    if (checked) {
      this.setOfCheckedId.add(id);
    } else {
      this.setOfCheckedId.delete(id);
    }
  }
}
